home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / asm / utils / gadgettest1 / gadget1.asm next >
Encoding:
Assembly Source File  |  1980-01-04  |  12.5 KB  |  355 lines

  1. ;*
  2. ;
  3. ; ### Gadgets by JM v1.0 ###
  4. ;
  5. ; - Created 910906 by JM -
  6. ;
  7. ; Edited:
  8. ;
  9. ; - 910913 by JM -> v1.0    - lopullinen kommentoitu versio.
  10. ;
  11. ;
  12.  
  13. ; Include-tiedostot, joissa on määritelty käyttöjärjestelmään liittyviä
  14. ; struktuureja ja vakioita.
  15.  
  16.         include "exec/types.i"
  17.         include "exec/nodes.i"
  18.         include "exec/lists.i"
  19.         include "exec/memory.i"
  20.         include    "graphics/gfx.i"
  21.         include    "graphics/gfxbase.i"
  22.         include    "graphics/text.i"
  23.         include    "intuition/intuition.i"
  24.         include    "intuition/screens.i"
  25.  
  26.  
  27. ; Makrot, joiden avulla käyttöjärjestelmän rutiineja on helpompi kutsua.
  28. ; Makrot määrittelevät automaattisesti kaikki kutsutut rutiinit linkkeriä
  29. ; varten ja lataavat kirjaston perusosoitteen a6:een ennen rutiinin kut-
  30. ; sumista.
  31. ; Esimerkiksi "lib intui,OpenWindow" purkautuu käskyiksi
  32. ;   xref   _LVOOpenWindow
  33. ;   move.l intuibase(a4),a6
  34. ;   jsr    _LVOOpenWindow(a6)
  35. ;
  36. ; flib vastaa lib-makroa, mutta ei lataa automaattisesti kirjaston perus-
  37. ; osoitetta a6:een.  Tästä on hyötyä kutsuttaessa useita samassa kirjas-
  38. ; tossa olevia rutiineja peräkkäin (a6:n arvo säilyy kutsujen aikana).
  39.  
  40. lib        macro            ; käyttö: lib kirjasto,rutiini
  41.         xref    _LVO\2        ; määrittelee offsetin
  42.         move.l    \1base(a4),a6    ; ottaa kirjaston perusosoitteen
  43.         jsr    _LVO\2(a6)    ; kutsuu rutiinia _LVOxxx(a6)
  44.         endm
  45.  
  46. flib        macro            ; käyttö: flib kirjasto,rutiini
  47.         xref    _LVO\2        ; määrittelee offsetin
  48.         jsr    _LVO\2(a6)    ; kutsuu rutiinia _LVOxxx(a6)
  49.         endm
  50.  
  51. exec        macro            ; käyttö: exec rutiini
  52.         xref    _LVO\1        ; maarittelee offsetin
  53.         move.l    $4,a6        ; ottaa execin perusosoitteen
  54.         jsr    _LVO\1(a6)    ; kutsuu rutiinia _LVOxxx(a6)
  55.         endm
  56.  
  57.  
  58. ; Ikkunan liput, jotka määräävät ikkunan ominaisuudet.  Erikoinen
  59. ; määrittelytapa johtuu siitä, että liput eivät mahdu yhdelle riville.
  60. ;
  61. WFLAGS        set    SIMPLE_REFRESH!NOCAREREFRESH!WINDOWDEPTH
  62. WFLAGS        set    WFLAGS!WINDOWDRAG!WINDOWSIZING!WINDOWCLOSE
  63.  
  64. ; IDCMP-liput, jotka kertovat, mistä tapahtumista Intuitionin on
  65. ; lähetettävä ohjelmalle viestejä.  Tässä ohjelmassa odotetaan
  66. ; vain gadgettien vapauttamiseen ja ikkunan sulkemiseen liittyviä viestejä.
  67. ;
  68. IDCMPFLAGS    set    CLOSEWINDOW!GADGETUP    ; IDCMP
  69.  
  70. ; Määritellään offsetit pinossa oleviin muuttujiin.  Muuttujatila varataan
  71. ; ohjelman alussa link-käskyllä.
  72. ;
  73. intuibase    equ    -4    ; tila Intuition-kirjaston osoittimelle
  74. gfxbase        equ    -8    ; tila Graphics-kirjaston osoittimelle
  75. window        equ    -12    ; tila Window-osoittimelle
  76. rp        equ    -16    ; tila RastPort-osoittimelle
  77. quit        equ    -20    ; lippu: pitää poistua
  78.  
  79.  
  80. ; Pääohjelma.  Alussa nollataan pinomuuttujat ja avataan tarvittavat
  81. ; kirjastot (Intuition ja Graphics).
  82. ;
  83. main    link    a4,#-24            ; varataan muuttujatilaa
  84.     clr.l    intuibase(a4)        ; nollataan muuttujat
  85.     clr.l    gfxbase(a4)
  86.     clr.l    window(a4)
  87.     clr.w    quit(a4)        ; nolla: ei poistuta
  88.  
  89.     lea    gfx(pc),a1        ; grafiikkakirjaston nimi
  90.     moveq    #0,d0            ; kirjastoversio (mikä tahansa)
  91.     exec    OpenLibrary        ; kutsutaan OpenLibrary()ä
  92.     move.l    d0,gfxbase(a4)        ; talletetaan gfx:n perusosoite
  93.     beq    cleanup            ; jos kirjastoa ei ole, pois!
  94.  
  95.     lea    intui(pc),a1        ; Intuition-kirjaston nimi
  96.     moveq    #0,d0            ; kirjastoversio (mikä tahansa)
  97.     exec    OpenLibrary        ; kutsutaan OpenLibrary()ä
  98.     move.l    d0,intuibase(a4)    ; talletetaan I:n perusosoite
  99.     beq    cleanup            ; jos kirjastoa ei ole, pois!
  100.  
  101. ; Avataan ikkuna.  Intuition liittää gadgetit automaattisesti ikkunaan,
  102. ; koska niiden osoitin on asetettu NewWindow-struktuuriin.
  103.  
  104.     lea    Newwindow,a0        ; NewWindow-struktuurin osoite
  105.     lib    intui,OpenWindow    ; kutsutaan OpenWindow()ia
  106.     move.l    d0,window(a4)        ; talletetaan Window:n osoite
  107.     beq    cleanup            ; jos ei auennut, pois!
  108.     move.l    d0,a0
  109.     move.l    wd_RPort(a0),rp(a4)    ; otetaan RastPortin osoite
  110.     move.l    wd_UserPort(a0),a5    ; ikkunan viestiportti a5:een
  111.  
  112. ;----------------------------------------------------------------------------
  113. ;
  114. ; Silmukka, jossa odotetaan IDCMP-viestejä ja käsitellään niiden komennot.
  115. ; Odottaminen tapahtuu Execin Wait-rutiinilla.
  116. ; Kun ohjelma saa CLOSEWINDOW-viestin, asetetaan lippu merkiksi siitä, että
  117. ; ohjelman pitäisi poistua.  Sitten luetaan muut mahdolliset IDCMP-viestit,
  118. ; minkä jälkeen ohjelma päättyy.
  119. ; Kun käyttäjä vapauttaa jomman kumman gadgetin, ohjelma saa GADGETUP-viestin
  120. ; ja lukee ao. gadgetin UserData-kentästä kutsuttavan aliohjelman osoitteen.
  121.  
  122. loop    tst.w    quit(a4)        ; pitääkö poistua?
  123.     bne    cleanup            ; joop -> voe tokkiisa
  124.  
  125. w_idcmp    moveq    #0,d0            ; bittimaski = 0
  126.     move.b    MP_SIGBIT(a5),d1    ; signaalibitin numero
  127.     bset    d1,d0            ; muunnetaan bittimaskiksi
  128.     exec    Wait            ; odotetaan IDCMP-viestiä
  129.  
  130. nextmsg    move.l    a5,a0            ; viestiportti
  131.     exec    GetMsg            ; otetaan saapunut viesti
  132.     tst.l    d0
  133.     beq.s    loop            ; häh? ei viestiä? odotetaan lisää!
  134.  
  135.     move.l    d0,a1            ; saadun viestin osoite a1:een
  136.     move.l    im_Class(a1),d2        ; viestin tyyppi d2:een
  137.     move.w    im_Code(a1),d3        ; koodi (esim. näppäimen numero)
  138.     move.l    im_IAddress(a1),a2    ; gadgetin tms. osoite
  139.  
  140.     exec    ReplyMsg        ; vastataan viestiin
  141.  
  142.     cmp.l    #CLOSEWINDOW,d2        ; painettiinko sulkunappulaa?
  143.     bne.s    10$            ; ei -> hyppää
  144.     move.w    #1,quit(a4)        ; kyllä: asetetaan lippu
  145.     bra.s    nextmsg            ; luetaan loput viestit
  146.  
  147. 10$    cmp.l    #GADGETUP,d2        ; gadget-viesti?
  148.     bne    nextmsg            ; ei -> luetaan seuraava viesti
  149.     move.l    gg_UserData(a2),a0    ; kyllä: otetaan UserData-kenttä
  150.     jsr    (a0)            ; kutsutaan aliohjelmaa
  151.     bra    nextmsg            ; tarkistetaan, onko muita viestejä
  152.  
  153. ; cleanup sulkee kaiken, mikä oli avoinna.  Ennen sulkemista testataan,
  154. ; että suljettava olio oli avautunut - esimerkiksi ikkunaa ei voi sulkea,
  155. ; ellei se ole auki (guru).  Jos olion osoitin on nolla, se merkitsee,
  156. ; ettei kyseinen olio ole auki.
  157.  
  158. cleanup    move.l    window(a4),d0        ; onko ikkuna auki?
  159.     beq.s    101$            ; ei -> hypätään
  160.     move.l    d0,a0
  161.     lib    intui,CloseWindow    ; suljetaan ikkuna
  162.  
  163. 101$    move.l    gfxbase(a4),d0        ; graphics auki?
  164.     beq.s    201$            ; ei -> loikataan
  165.     move.l    d0,a1
  166.     exec    CloseLibrary        ; suljetaan graphics-kirjasto
  167.  
  168. 201$    move.l    intuibase(a4),d0    ; intuition auki?
  169.     beq.s    202$            ; ei -> harpataan
  170.     move.l    d0,a1
  171.     exec    CloseLibrary        ; suljetaan intuition
  172.  
  173. 202$    unlk    a4            ; vapautetaan pinoalue
  174.     moveq    #0,d0            ; ei virhettä
  175.     rts                ; poistutaan
  176.  
  177.  
  178. ;----------------------------------------------------------------------------
  179. ;
  180. ; Gadget-aliohjelmat, jotka ajetaan ao. gadgetin vapauttamisen (GADGETUP-
  181. ; viestin) jälkeen.
  182. ; String-gadgetin rutiini asettaa näppäillyn merkkijonon ikkunan otsikko-
  183. ; palkkiin, boolean-gadget puolestaan tyhjentää string-gadgetin puskurimuis-
  184. ; tin nollaamalla puskurin ensimmäisen paikan.
  185. ;
  186. StrRtn    move.l    gg_SpecialInfo(a2),a1    ; StringInfo
  187.     move.l    si_Buffer(a1),a1    ; gadgetin tekstipuskuri a1:een
  188.     move.l    window(a4),a0        ; ikkuna
  189.     moveq    #-1,d0            ; -1 d0:aan
  190.     move.l    d0,a2            ; ei muuteta näytön otsikkotekstiä
  191.     lib    intui,SetWindowTitles    ; asetetaan ikkunan otsikkoteksti
  192.     rts
  193.  
  194. BoolRtn    lea.l    StringGadget,a0        ; string-gadget
  195.     move.l    gg_SpecialInfo(a0),a1    ; StringInfo
  196.     move.l    si_Buffer(a1),a1    ; gadgetin tekstipuskuri
  197.     clr.b    (a1)            ; 'tyhjennetään' puskuri
  198.     move.l    window(a4),a1        ; ikkunan osoitin
  199.     sub.l    a2,a2            ; ei requester
  200.     moveq    #1,d0            ; päivitetään vain yksi gadget
  201.     lib    intui,RefreshGList
  202.     rts
  203.  
  204.  
  205. ;----------------------------------------------------------------------------
  206. ;
  207. gfx    dc.b    "graphics.library",0    ; kirjastojen nimet
  208. intui    dc.b    "intuition.library",0
  209.     ds.w    0            ; varmistetaan osoite parilliseksi
  210. ;----------------------------------------------------------------------------
  211. ;
  212. ; Muuttuvat struktuurit, jotka on sijoitettu erilliseen data-tyyppiseen
  213. ; lohkoon, jolloin itse ohjelman koodi pysyy muuttumattomana suositusten
  214. ; mukaisesti.
  215.  
  216.         section    struct,DATA
  217.  
  218. ; Ikkunoiden avaamisessa tarvittava NewWindow-struktuuri, joka sisältää
  219. ; tiedot ikkunan koosta, paikasta, väreistä ja niin edelleen.
  220. ;
  221. Newwindow    dc.w    10,100        ; ikkunan koordinaatit (x,y)
  222.         dc.w    300,60        ; ikkunan koko (x,y)
  223.         dc.b    0,1        ; kynien värit
  224.         dc.l    IDCMPFLAGS    ; vahdi sulkunappulaa yms
  225.         dc.l    WFLAGS        ; liput
  226.         dc.l    StringGadget    ; ensimmäinen gadget
  227.         dc.l    0        ; ei omaa checkmarkkia
  228.         dc.l    WTitle        ; ikkunan otsikkopalkin teksti
  229.         dc.l    0        ; näytön osoitin, ei tarvita tässä
  230.         dc.l    0        ; ei BitMap-osoitinta
  231.         dc.w    100,100        ; ikkunan minimikoko
  232.         dc.w    500,200        ; ikkunan maksimikoko
  233.         dc.w    WBENCHSCREEN    ; näytön tyyppi = WORKBENCH
  234.  
  235.  
  236. ;----------------------------------------------------------------------------
  237. ;
  238. ; Gadget-struktuurit ja niihin liittyvät apustruktuurit.  Tässä esimerkissä
  239. ; struktuureihin on suoraan asetettu osoittimet muihin struktuureihin, mikä
  240. ; helpottaa ohjelmointia.  Absoluuttiset viittaukset kuitenkin pidentävät
  241. ; ohjelman ajettavaa versiota, koska jokaisesta viittauksesta syntyy myös
  242. ; tieto siitä, miten kyseinen viittaus on käsiteltävä ohjelmaa ladattaessa.
  243. ; Parempi tapa olisi varata struktuureille muistia ohjelman ajon aikana ja
  244. ; luoda kaikki tarvittavat struktuurit ohjelmallisesti ja asettaa samalla
  245. ; osoittimet toisiin struktuureihin.
  246. :
  247. StringGadget    dc.l    BoolGadget    ; osoitin seuraavaan gadgettiin
  248.         dc.w    10,20        ; x- ja y-paikka
  249.         dc.w    200,10        ; x- ja y-koko
  250.         dc.w    GADGHCOMP    ; liput
  251.         dc.w    RELVERIFY    ; toiminto vasta vapautettaessa
  252.         dc.w    STRGADGET    ; tyyppi = string
  253.         dc.l    StringBorder    ; kehys gadgetin ympärille ->
  254.         dc.l    0        ; aktivoidessa ei uutta kuviota
  255.         dc.l    0        ; ei tekstiä
  256.         dc.l    0        ; mutual exclude, ei käytössä
  257.         dc.l    StringSInfo    ; special info -> StringInfo
  258.         dc.w    0        ; gadget ID
  259.         dc.l    StrRtn        ; userdata
  260.  
  261. StringSInfo    dc.l    buffer        ; puskuri gadgetin tekstille
  262.         dc.l    undo_buffer    ; undo-puskuri
  263.         dc.w    0        ; paikka, jossa ollaan editoimassa
  264.         dc.w    32        ; maksimi merkkien määrä
  265.         dc.w    0        ; ensimmäinen näytöllä näkyvä merkki
  266.         dc.w    0,0,0,0,0    ; Intuitionin sisäisiä muuttujia
  267.         dc.l    0        ; ei käytössä 1.3:ssa
  268.         dc.l    0        ; longint (ei käytössä tässä)
  269.         dc.l    0        ; vaihtoehtoinen näppäinkartta
  270.  
  271. ; struktuuri, joka määrittelee gadgetin ympärille piirrettävän kehyksen
  272. StringBorder    dc.w    -2,-2        ; suhteellinen paikka
  273.         dc.b    1,2        ; piirtovärit
  274.         dc.b    RP_JAM1        ; piirtomoodi
  275.         dc.b    5        ; koordinaattiparien määrä
  276.         dc.l    StringVectors    ; koordinaattiparitaulukko ->
  277.         dc.l    0        ; ei useampia Border-struktuureja
  278.  
  279. StringVectors    dc.w    0,0,203,0,203,11,0,11,0,0 ; viivojen koordinaattiparit
  280.  
  281.  
  282. BoolGadget    dc.l    0        ; ei enempää gadgetteja
  283.         dc.w    220,19        ; x- ja y-paikka
  284.         dc.w    56,10        ; x- ja y-koko
  285.         dc.w    GADGHCOMP    ; liput
  286.         dc.w    RELVERIFY    ; toiminto vasta vapautettaessa
  287.         dc.w    BOOLGADGET    ; tyyppi = boolean
  288.         dc.l    BoolBorder    ; kehys gadgetin ympärille ->
  289.         dc.l    0        ; aktivoidessa ei uutta kuviota
  290.         dc.l    BoolText    ; teksti ->
  291.         dc.l    0        ; mutual exclude, ei käytössä
  292.         dc.l    0        ; special info (ei tarpeen)
  293.         dc.w    0        ; gadget ID
  294.         dc.l    BoolRtn        ; userdata
  295.  
  296. ; struktuuri, joka määrittelee gadgetin ympärille piirrettävän kehyksen
  297. BoolBorder    dc.w    -1,-1        ; suhteellinen paikka
  298.         dc.b    1,2        ; piirtovärit
  299.         dc.b    RP_JAM1        ; piirtomoodi
  300.         dc.b    5        ; koordinaattiparien määrä
  301.         dc.l    BoolVectors    ; koordinaattiparit ->
  302.         dc.l    0        ; ei useampia Border-struktuureja
  303.  
  304. BoolVectors    dc.w    0,0,57,0,57,11,0,11,0,0 ; viivojen koordinaattiparit
  305.  
  306. ; IntuiText-struktuuri boolean-gadgetin tekstiä varten
  307. BoolText    dc.b    1,2        ; piirtovärit
  308.         dc.b    RP_JAM1        ; piirtomoodi
  309.         dc.b    0        ; (ei käytössä)
  310.         dc.w    8,1        ; suhteellinen paikka
  311.         dc.l    0        ; fontti = oletusfontti
  312.         dc.l    Bool_Text    ; teksti
  313.         dc.l    0        ; ei lisätekstiä
  314.  
  315. ;----------------------------------------------------------------------------
  316. ;
  317. ; Tarvittavaa fontia ei ole asetettu, vaan ohjelma käyttää systeemin oletus-
  318. ; fonttia.  Gadgettien koot on laskettu 8 pisteen fontille ja esimerkiksi
  319. ; Kickstart 2.0:n alla käytettävät suuremmat fontit tai tavallinen Topaz 9
  320. ; sotkevat ohjelman ulkonäön.  Kickstart 1.3:ssa ei kuitenkaan ole mahdol-
  321. ; lista asettaa fonttia string-gadgettiin muutoin kuin avaamalla oman näytön
  322. ; (screen) ja asettamalla siihen haluamansa fontin.  Gadgetit käyttävät aina
  323. ; näytön oletusfonttia.
  324. ;
  325. ;----------------------------------------------------------------------------
  326. ;
  327. ; Tekstit:
  328. ;
  329. WTitle        dc.b    "SimpleRefresh-ikkuna",0
  330. Bool_Text    dc.b    "PAINA",0
  331.         ds.w    0
  332.  
  333. ;----------------------------------------------------------------------------
  334. ;
  335. ; String-gadgetin puskurit on sijoitettu omaan BSS-hunkkiinsa, jolloin ne
  336. ; eivät vie tilaa ohjelman käännetystä versiosta, mutta niille varataan
  337. ; automaattisesti tilaa ohjelmaa ladattaessa.  Haittapuolena on, että
  338. ; puskureihin ei voi viitata lyhyemmällä ja nopeammalla suhteellisella
  339. ; osoituksella, vaan on aina käytettävä absoluuttista osoitusmuotoa (koska
  340. ; BSS-hunkki voi sijoittua muistissa minne tahansa, ei kiinteään paikkaan
  341. ; muuhun ohjelmaan nähden).  Toinen haitta on, ettei ohjelmaa voi ladata
  342. ; residentiksi, koska kaikki samaan aikaan ajettavat ohjelmakopiot käyttäi-
  343. ; sivät samaa puskuria.  Toisaalta puskureissa olisi uusilla ajokerroilla
  344. ; entistä tietoa nollatavujen sijasta, koska BSS-hunkki nollataan vain
  345. ; kerran ohjelmaa ladattaessa.  Menetelmän etuna taas on, ettei muistia
  346. ; tarvitse erikseen varata.
  347.  
  348.         section    puskurit,bss
  349.  
  350. buffer        ds.b    34
  351. undo_buffer    ds.b    34
  352.  
  353.         end
  354.  
  355.